/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager;

import br.com.deployment.entidade.fermojupi.AtoItem;
import br.com.deployment.entidade.fermojupi.AtoTipo;
import br.com.deployment.entidade.fermojupi.Emolumento;
import br.com.deployment.entidade.fermojupi.EmolumentoItem;
import br.com.deployment.escritura.Escritura;
import br.com.deployment.escritura.EscrituraOld;
import br.com.deployment.escritura.importEscrituraIn;
import br.com.deployment.message.Msg;
import br.com.deployment.servico.AtoItemServico;
import br.com.deployment.servico.AtoTipoServico;
import br.com.deployment.servico.EmolumentoServico;
import java.io.*;
import java.math.BigDecimal;
import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import org.primefaces.model.UploadedFile;

/**
 *
 * @author roniere
 */
@ManagedBean
@ViewScoped
public class ManagerUpload implements Serializable {

    @EJB
    AtoTipoServico atoTipoDao;
    @EJB
    AtoItemServico atoItemDao;
    @EJB
    EmolumentoServico emolumentoDao;
    private UploadedFile fileAto;
    private UploadedFile fileEmol;
    private UploadedFile fileEscritura;
    private AtoTipo atoTipo;
    private AtoItem ato;
    private Emolumento emol;
    private List<EmolumentoItem> lstEmolItem;
    private List<EscrituraOld> list;
    private Date dataIni;
    private Date dataFim;

    @PostConstruct
    public void init() throws IOException {

        atoTipo = new AtoTipo();
        ato = new AtoItem();
        emol = new Emolumento();
        lstEmolItem = new ArrayList<EmolumentoItem>();
    }

    public Date getDataFim() {
        return dataFim;
    }

    public void setDataFim(Date dataFim) {
        this.dataFim = dataFim;
    }

    public Date getDataIni() {
        return dataIni;
    }

    public void setDataIni(Date dataIni) {
        this.dataIni = dataIni;
    }

    public UploadedFile getFileEscritura() {
        return fileEscritura;
    }

    public void setFileEscritura(UploadedFile fileEscritura) {
        this.fileEscritura = fileEscritura;
    }

    public UploadedFile getFileAto() {
        return fileAto;
    }

    public void setFileAto(UploadedFile fileAto) {
        this.fileAto = fileAto;
    }

    public UploadedFile getFileEmol() {
        return fileEmol;
    }

    public void setFileEmol(UploadedFile fileEmol) {
        this.fileEmol = fileEmol;
    }

    public void upload() throws IOException {
        String nomeAto = "";
        String nomeEmol = "";

        if (fileAto != null) {
            nomeAto = fileAto.getFileName();
        }
        if (fileEmol != null) {
            nomeEmol = fileEmol.getFileName();
        }

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();

        String caminho = scontext.getRealPath("" + nomeAto);

        caminho = "/opt/glassfish3/glassfish/";//caminho.split("/Cartorio-war_war/")[0] + "/Cartorio-war/";///web/Uploads/" ;

        System.err.println("caminho " + caminho);
        if (fileAto != null) {
            gerarAto(fileAto.getInputstream());
        }

        if (fileEmol != null) {
            gerarEmol(fileEmol.getInputstream());
        }
    }

    public String criaArquivo(byte[] bytes, String arquivo) {
        FileOutputStream fos;
        try {
            fos = new FileOutputStream(arquivo);
            fos.write(bytes);
            fos.close();
            return arquivo;
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ManagerArquivo.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ManagerArquivo.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public void gerarAto(InputStream arquivo) throws IOException {
        InputStreamReader isr = new InputStreamReader(arquivo);
        BufferedReader in = new BufferedReader(isr);
        String s;
        while ((s = in.readLine()) != null) {
            System.err.println(s);
            if (s.contains("#")) {
                insertAtoTipo(s.replace("#", ""));
            } else {
                insertAto(s);
            }
        }
        
        
        in.close();
        Msg.messagemInfo("Ato Concluído com Sucesso !");
    }

    public void gerarEmol(InputStream arquivo) throws IOException {
        InputStreamReader isr = new InputStreamReader(arquivo);
        BufferedReader in = new BufferedReader(isr);
        String s;
        while ((s = in.readLine()) != null) {
            if (s.contains("#")) {
                insertEmol(s.replace("#", ""));
            } else {
                insertEmolItem(s);
            }
        }
        in.close();
        if (!lstEmolItem.isEmpty()) {
            for (EmolumentoItem ei : lstEmolItem) {
                ei.setEmol(emol);
            }
            emol.setEmolItem(lstEmolItem);
            emolumentoDao.salvar(emol);
            emol = new Emolumento();
        }
        Msg.messagemInfo("Emolumento Concluído com Sucesso !");
    }

    public void insertEmolItem(String str) {

        String[] emolAux = str.split(";");
        EmolumentoItem ei = new EmolumentoItem();
        System.err.println("EMOL: " + emolAux[0]);
        ei.setStatus(true);
        ei.setAtoItem(atoItemDao.findCod(emolAux[0]));
        ei.setCartorio(new BigDecimal(emolAux[3]));
        ei.setFermojupi(new BigDecimal(emolAux[4]));
        ei.setValor(new BigDecimal(emolAux[5]));

        if (emolAux[6].equalsIgnoreCase("SIM")) {
            ei.setOab(true);
        } else if (emolAux[6].equalsIgnoreCase("NÃO")) {
            ei.setOab(false);
        }
        if (emolAux[1].length() > 0) {
            ei.setValInicial(new BigDecimal(emolAux[1]));
        }
        if (emolAux[2].length() > 0) {
            ei.setValFinal(new BigDecimal(emolAux[2]));
        }
        lstEmolItem.add(ei);
    }

    public void insertEmol(String str) {
        String[] emolAux = str.split(";");
        emol.setDescricao(emolAux[0]);
        emol.setValorSelo(Double.parseDouble(emolAux[2]));

        try {
            emol.setDatVigor(new SimpleDateFormat("dd/MM/yyyy").parse(emolAux[1]));
        } catch (ParseException ex) {
            Logger.getLogger(ManagerUpload.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void insertAtoTipo(String desc) {
        String[] atoTipoAux = desc.split(";");
        atoTipo.setCodigo(atoTipoAux[0]);
        atoTipo.setDescricao(atoTipoAux[1]);
        atoTipoDao.salvar(atoTipo);
        System.err.println(atoTipo.getDescricao());
    }

    public void insertAto(String str) {
        String[] atoAux = str.split(";");
        ato.setCodigo(atoAux[0]);
        ato.setDescricao(atoAux[1]);
        ato.setAtivo(true);
        ato.setAtoTipo(atoTipoDao.findCodigo(atoTipo.getCodigo()));
        atoItemDao.salvar(ato);
    }
    @EJB
    importEscrituraIn importEscrituraIn;

    
    public void importaTxtToBD(String str){
        InputStreamReader isr = null;
        try {
            isr = new InputStreamReader(new FileInputStream("str"));
            BufferedReader in = new BufferedReader(isr);
            String s;
            List<EscrituraOld> list = new ArrayList<EscrituraOld>();
            while ((s = in.readLine()) != null) {
                String[] campo = s.split(";");
                EscrituraOld eo = new EscrituraOld();
                eo.setLiv(campo[1].replace("E", "").replace("\"", ""));
                eo.setFls(campo[2].replace("\"", ""));
                eo.setOut(campo[4].replace("\"", ""));
                eo.setOud(campo[5].replace("\"", ""));
                eo.setDat(campo[9].replace("\"", "").replace("1913", "2013"));
                list.add(eo);
                eo = new EscrituraOld();
            }
        } catch (IOException ex) {
            Logger.getLogger(ManagerUpload.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                isr.close();
            } catch (IOException ex) {
                Logger.getLogger(ManagerUpload.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
    }
    public void importTxtEscritura() throws IOException {
        String d1 = "";
        String d2 = "";

        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");

        d1 = sdf2.format(dataIni);
        d2 = sdf2.format(dataFim);

        Map<String, String> key = new HashMap<String, String>();
        key.put("4", "6");
        key.put("14", "35");
        key.put("15", "10");
        key.put("37", "5");
        key.put("9", "14");
        key.put("51", "17");
        key.put("8", "21");
        key.put("49", "53");
        key.put("5", "22");
        key.put("24", "23");
        key.put("54", "54");
        key.put("48", "24");
        key.put("10", "25");
        key.put("52", "28");
        key.put("33", "30");
        key.put("18", "33");
        key.put("56", "34");
        key.put("22", "36");

        list = importEscrituraIn.findAll(d1, d2);

        System.err.println(d1 + "" + d2 + "Qtd List: " + list.size());
        String txt = "/opt/escritura+" + d1 + "a" + d2 + ".txt";
        BufferedWriter writer = new BufferedWriter(new FileWriter(txt));
        writer.write("\"TIPOATOCEP\";\"NATUREZAESCRITURA\";\"DATAATO\";\"LIVRO\";\"LIVROCOMPLEMENTO\";\"FOLHA\";\"FOLHACOMPLEMENTO\";\"VALOR\";\"DESCONHECIDO\";\"REFERENTELIVRO\";\"REFERENTELIVROCOMPLEMENTO\";\"REFERENTEFOLHA\";\"REFERENTEFOLHACOMPLEMENTO\";\"REFERENTEUFORIGEM\";\"REFERENTECIDADEORIGEM\";\"REFERENTECARTORIO\";\"PARTENOME\";\"PARTEIDENTIDADE\";\"PARTEORGAOEMISSOR\";\"PARTETIPODOCUMENTO\";\"PARTENUMERODOCUMENTO\";\"PARTEQUALIDADE\"" + "\r");

        for (EscrituraOld eo : list) {
            Escritura e = new Escritura();
            Escritura e2 = new Escritura();

            e.setTIPOATOCEP("1");
            e.setNATUREZAESCRITURA(key.get(eo.getTip()) == null ? "51" : key.get(eo.getTip()));

            e.setDATAATO(sdf.format(eo.getData()));

            e.setLIVRO(eo.getLiv());
            e.setFOLHA(eo.getFls());
            e.setVALOR("0.0");
            //OUTORGANTE
            if (eo.getOut() != null && !eo.getOut().equals(".") && !eo.getOut().trim().equals("")) {
                e.setPARTENOME(eo.getOut());
                e.setPARTEQUALIDADE("Outorgante");

                if (eo.getCpfof() == null && eo.getCpfoj() != null) {
                    e.setPARTETIPODOCUMENTO(eo.getCpfoj() == null ? "" : "CNPJ");
                    e.setPARTENUMERODOCUMENTO(eo.getCpfoj());
                } else {
                    e.setPARTETIPODOCUMENTO(eo.getCpfof() == null ? "" : "CPF");
                    e.setPARTENUMERODOCUMENTO(eo.getCpfof());
                }
                writer.write(e.toString().replace("\"null\"", "\"\"") + "\r");
                writer.newLine();

            }

            //OUTORGADO
            if (eo.getOud() != null && !eo.getOud().equals(".") && !eo.getOut().trim().equals("")) {
//                e2 = new Escritura();
                e2 = e;
                e2.setPARTEQUALIDADE("Outorgado");
                e2.setPARTENOME(eo.getOud());
                if (eo.getCpfdf() == null && eo.getCpfdj() != null) {
                    e2.setPARTETIPODOCUMENTO(eo.getCpfdj() == null ? "" : "CNPJ");
                    e2.setPARTENUMERODOCUMENTO(eo.getCpfdj());
                } else {
                    e2.setPARTETIPODOCUMENTO(eo.getCpfdf() == null ? "" : "CPF");
                    e2.setPARTENUMERODOCUMENTO(eo.getCpfdf());
                }
                writer.write(e2.toString().replace("\"null\"", "\"\"") + "\r");
                writer.newLine();
            }
        }
        writer.flush();
        writer.close();
        fileEscritura(txt);
        System.err.println("FINALIZOU");
    }

    public void fileEscritura(String txt) throws IOException {

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setResponseHeader("Content-Type", "txt");
        externalContext.setResponseHeader("Content-Disposition", "attachment;filename=\"" + txt.replace("_", "").replace("opt", "") + "\"");
        externalContext.getResponseOutputStream().write(recuperaFileEmByte(new File(txt)));
        facesContext.responseComplete();

    }

    private byte[] recuperaFileEmByte(File inFile) {
        InputStream is = null;
        byte[] buffer = null;
        try {
            is = new FileInputStream(inFile);
            buffer = new byte[is.available()];
            is.read(buffer);
            is.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer;
    }
    
    

    public List<EscrituraOld> getList() {
        return list;
    }

    public void setList(List<EscrituraOld> list) {
        this.list = list;
    }
}
